package gestorbienraizok.inmuebles;

import gestorBD.Controlador;
import java.util.LinkedList;

public class Casa extends Inmueble {

    private static int numeroDeCasasRegistradas = 0;
    private byte numeroPisos;
    private LinkedList<Garaje> listaGarajes;

    public Casa() {
        Casa.numeroDeCasasRegistradas++;
    }

    public Casa(String codigo, byte numeroPisos) {
        super(codigo);
        this.numeroPisos = numeroPisos;
        this.listaGarajes = new LinkedList();
        Casa.numeroDeCasasRegistradas++;
    }

    public static int getNumeroDeCasasRegistradas() {
        return Casa.numeroDeCasasRegistradas;
    }

    public byte getNumeroPisos() {
        return this.numeroPisos;
    }

    public LinkedList<Garaje> getListaGarajes() {
        return this.listaGarajes;
    }

    public static void setNumeroDeCasasRegistradas(int numero) {
        Casa.numeroDeCasasRegistradas = numero;
    }

    public void setNumeroPisos(byte numeroPisos) {
        this.numeroPisos = numeroPisos;
    }

    public void setListaGarajes(LinkedList<Garaje> listaGarajes) {
        this.listaGarajes = listaGarajes;
    }

    public byte getCantidadDeGarajes() {
        return (byte) this.listaGarajes.size();
    }

    public void anhadirGaraje(Garaje garaje) {
        this.listaGarajes.add(garaje);
    }

    public String toStringParaBusquedaPorCriterios(boolean esParaArrendar) {
        String descripcion = new String();

        Unidad estaUnidad = Unidad.buscarUnidadPorCodigoDeInmueble(this.codigo);
        descripcion += String.format("%-9s", this.codigo);
        descripcion += String.format("%-19s", estaUnidad.getDireccion());
        descripcion += String.format("%-28s", estaUnidad.getNombre());
        if (esParaArrendar) {
            descripcion += Controlador.formatearPrecio(this.getTarifaDeArrendamiento());
        } else {
            descripcion += Controlador.formatearPrecio(this.getPrecioDeVenta());
        }

        return descripcion;
    }

    public static boolean laCasaAplica(Casa estaCasa, boolean seBuscaParaArrendar, int areaMinima, int areaMaxima,
            byte estratoMinimo, byte estratoMaximo, byte numeroDeBanhosMinimo,
            byte numeroDeEspaciosMinimo, byte numeroDeGarajesMinimo, long valorMinimo, long valorMaximo) {

        //Antes de comparar las caracteristicas, se verifica que el rol de la casa no sea "No disponible"
        //y que tampoco haya sido ya vendida o arrendada. También que su rol coincida con el que se busca
        if (estaCasa.obtenerRol().equals("No disponible") || !estaCasa.obtenerDisponibilidad().equals("Disponible")) {
            return false;
        }

        boolean sePuedeArrendarLaCasa;
        if (estaCasa.obtenerRol().toLowerCase().contains("alquiler")) {
            sePuedeArrendarLaCasa = true;
        } else { //si solo esta para la venta
            sePuedeArrendarLaCasa = false;
        }

        boolean sePuedeVenderLaCasa;
        if (estaCasa.obtenerRol().toLowerCase().contains("venta")) {
            sePuedeVenderLaCasa = true;
        } else { //Si solo esta para arrendar
            sePuedeVenderLaCasa = false;
        }

        if (seBuscaParaArrendar && !sePuedeArrendarLaCasa) {
            return false;
        }

        if (!seBuscaParaArrendar && !sePuedeVenderLaCasa) {
            return false;
        }

        float areaCasa = estaCasa.getAreaTotal();
        byte estratoCasa = estaCasa.getUnidad().getEstrato();
        byte numBanhosCasa = estaCasa.numeroDeBanhos();
        byte numEspaciosCasa = estaCasa.numeroDePiezas();
        byte numGarajesCasa = estaCasa.getCantidadDeGarajes();
        long valorVentaCasa = estaCasa.getPrecioDeVenta();
        long valorArrendCasa = estaCasa.getTarifaDeArrendamiento();

        //Ya estan guardadas todas las caracteristicas de la casa en variables. Ahora se puede comparar:
        if (areaCasa < areaMinima || areaCasa > areaMaxima) {
            return false;
        }

        if (estratoCasa < estratoMinimo || estratoCasa > estratoMaximo) {
            return false;
        }

        if (numBanhosCasa < numeroDeBanhosMinimo) {
            return false;
        }

        if (numEspaciosCasa < numeroDeEspaciosMinimo) {
            return false;
        }

        if (numGarajesCasa < numeroDeGarajesMinimo) {
            return false;
        }

        if (seBuscaParaArrendar) {
            if (valorArrendCasa < valorMinimo || valorArrendCasa > valorMaximo) {
                return false;
            }
        } else {
            if (valorVentaCasa < valorMinimo || valorVentaCasa > valorMaximo) {
                return false;
            }
        }

        return true;   //Si pasa todas las comprobaciones

    }

    @Override
    public String toString() {
        String descripcion = new String();
        descripcion += "Código:            " + this.codigo + "\n";
        descripcion += "Área total:        " + this.areaTotal + " m2\n";
        descripcion += "Número de pisos:   " + this.numeroPisos + "\n";
        descripcion += "Número de alcobas: " + this.numeroDePiezas() + "\n";
        descripcion += "Número de garajes: " + this.getCantidadDeGarajes() + "\n";
        descripcion += "Número de baños:   " + this.numeroDeBanhos() + "\n\n";
        byte cantidadDeGarajes = this.getCantidadDeGarajes();

        descripcion += "Características de la unidad:\n";

        Unidad estaUnidad = Unidad.buscarUnidadPorCodigoDeInmueble(this.codigo);
        descripcion += estaUnidad.toString() + "\n";

        if (this.obtenerDisponibilidad().equals("Disponible")) {

            if (this.obtenerRol().equals("Venta")) {
                descripcion += "Esta propiedad está disponible para la venta:\n";
                descripcion += "Precio de venta:    " + Controlador.formatearPrecio(this.precioDeVenta) + "\n";
            } else if (this.obtenerRol().equals("Alquiler")) {
                descripcion += "Esta propiedad está disponible para arrendar:\n";
                descripcion += "Tarifa de arrendamiento:    " + Controlador.formatearPrecio(this.tarifaDeArrendamiento) + " mensual (administración incluida)\n";
            } else if (this.obtenerRol().equals("Venta y alquiler")) {
                descripcion += "Esta propiedad está disponible para la venta o para arrendar:\n";
                descripcion += "Precio de venta:            " + Controlador.formatearPrecio(this.precioDeVenta) + "\n";
                descripcion += "Tarifa de arrendamiento:    " + Controlador.formatearPrecio(this.tarifaDeArrendamiento) + " mensual (administración incluida)\n";
            } else {
                descripcion += "A esta propiedad no se la ha asignado un rol\n";
            }

        } else {
            descripcion += "Esta propiedad fue " + this.obtenerDisponibilidad().toLowerCase();
        }
        return descripcion;
    }

    @Override
    public String getTipo() {
        return "Casa";
    }

}
